package com.codeplatform.service;

import com.codeplatform.dto.LoginRequest;
import com.codeplatform.dto.RegisterRequest;
import com.codeplatform.dto.AuthResponse;
import com.codeplatform.dto.RefreshTokenRequest;
import com.codeplatform.entity.User;

/**
 * 用户认证服务接口
 */
public interface AuthService {
    
    /**
     * 用户注册
     * @param request 注册请求
     * @return 认证响应
     */
    AuthResponse register(RegisterRequest request);
    
    /**
     * 用户登录
     * @param request 登录请求
     * @return 认证响应
     */
    AuthResponse login(LoginRequest request);
    
    /**
     * 刷新令牌
     * @param request 刷新令牌请求
     * @return 认证响应
     */
    AuthResponse refreshToken(RefreshTokenRequest request);
    
    /**
     * 用户登出
     * @param token 访问令牌
     * @return 是否成功
     */
    Boolean logout(String token);
    
    /**
     * 验证令牌
     * @param token 访问令牌
     * @return 用户信息
     */
    User validateToken(String token);
    
    /**
     * 检查用户名是否可用
     * @param username 用户名
     * @return 是否可用
     */
    Boolean isUsernameAvailable(String username);
    
    /**
     * 检查邮箱是否可用
     * @param email 邮箱
     * @return 是否可用
     */
    Boolean isEmailAvailable(String email);
    
    /**
     * 修改密码
     * @param userId 用户ID
     * @param oldPassword 旧密码
     * @param newPassword 新密码
     * @return 是否成功
     */
    Boolean changePassword(Long userId, String oldPassword, String newPassword);
    
    /**
     * 重置密码（通过邮箱）
     * @param email 邮箱
     * @return 是否成功
     */
    Boolean resetPassword(String email);
    
    /**
     * 激活用户账户
     * @param token 激活令牌
     * @return 是否成功
     */
    Boolean activateAccount(String token);
    
    /**
     * 更新用户信息
     * @param userId 用户ID
     * @param username 用户名
     * @param nickname 昵称
     * @param email 邮箱
     * @param newPassword 新密码（可选，为null时不修改密码）
     * @return 更新后的用户信息
     */
    AuthResponse.UserInfo updateUserInfo(Long userId, String username, String nickname, String email, String newPassword);

}